/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package Server.SQL;

import Server.Helper.Analyzer;
import Server.Helper.StringHelper;
import Server.MyDataType.Attribute_Value;
import Server.MyDataType.MyDataDynamic;
import Server.lastproject.XMLManage;
import java.util.Vector;

/**
 *
 * @author Gnoc
 */

    /*
     * UPDATE table_name
     * SET column1=value, column2=value2,...
     * WHERE some_column=some_value
     */
public class UpdateCommand extends MyCommand
{
    Vector<Attribute_Value> lstColumnsSet = new Vector<>();
    
    public UpdateCommand(String command)
    {
        super(command);
    }
    
    public MyDataDynamic Analysis(String cmd)
    {
        MyDataDynamic data = new MyDataDynamic();
        try
        {   
            cmd = new Analyzer().MakeCommandStandardization(cmd);
            String clause[] = SplitClause(cmd);

            if(clause[0].compareTo("") != 0)
                table = clause[0];

            // Address='Nissestien 67', City='Sandnes'
            if(clause[1].compareTo("") != 0)
            {
                String[] lstSecond = clause[1].split(",");
                for(int i = 0; i<lstSecond.length; i++)
                {
                    String[] lstThirt = lstSecond[i].trim().split("=");
                    if(lstThirt.length >= 2)
                    {
                        Attribute_Value value = new Attribute_Value();
                        value.NameAttribute = lstThirt[0];
                        value.Value = new StringHelper().TrimApostrophe(lstThirt[1]);

                        lstColumnsSet.add(value);
                    }
                }
            }

            // LastName='Tjessem' AND FirstName='Jakob'
            if(clause[2].compareTo("") != 0)
            {
                lstColumnsWhere = SplitClauseWhere(clause[2]);
            }
        }
        catch(Exception ex)
        {
            return null;
        }
        
        // Thực thi câu lệnh sau khi Analysis
        boolean excute = Execute();
        
        if(excute)
            return data;
        else return null;
    }

    public boolean Execute()
    {
        try
        {
            XMLManage xml = new XMLManage();
            Vector<MyDataDynamic> lstData = new Vector<>();
            // Update Table
            // THông báo cho người dùng là cách update của người dùng 
            // này khá nguy hiểm vì nó thay đổi tất cả các row
            if(this.lstColumnsWhere.size() <= 0)
            {
                MyDataDynamic lstDataTemp = new MyDataDynamic();
                lstDataTemp.set_vtNameColumn(xml.getAllNameColumn(table));
                lstDataTemp._vtRowData = xml.getAllRowData(table);
                lstData.add(lstDataTemp);
            }


            /*
             * UPDATE table_name
             * SET column1=value, column2=value2,...
             * WHERE some_column=some_value
             */
            if(this.lstColumnsWhere.size() > 0)
            {
                lstData = ExcuteWhere();
            }
            
            // Thực hiện cập nhật các giá trị cho row
            for(int i = 0; i<lstData.size(); i++)
            {
                lstData.get(i).UpdateMyDataDynamic(lstColumnsSet);
            }
            for(int i = 0; i<lstData.size(); i++)
                xml.updateDataTable(table, lstData.get(i)._vtRowData);

            xml.saveToFile();
        }
        catch(Exception ex)
        {
            return false;
        }
        return true;
    }
    
    private String[] SplitClause(String cmd)
    {
        String[] clause = new String[3];
        clause[0] = "";
        clause[1] = "";
        clause[2] = "";
        
        String[] lstFirt = cmd.split(" ");
        
        int i = 0;
        //
        while(i<lstFirt.length && lstFirt[i].toUpperCase().compareTo("UPDATE") != 0)
        {
            i ++;
        }
        
        i++;
        // Lấy table
        while(i<lstFirt.length && lstFirt[i].toUpperCase().compareTo("SET") != 0)
        {
            clause[0] = lstFirt[i];
            i ++;
        }
        
        i++;
        // Lấy SET
        while(i<lstFirt.length && lstFirt[i].toUpperCase().compareTo("WHERE") != 0)
        {
            clause[1] += lstFirt[i] + " ";
            i ++;
        }
        
        i++;
        
        // Lấy WHERE
        while(i<lstFirt.length)
        {
            clause[2] += lstFirt[i] + " ";
            i ++;
        }
        
        clause[0] = clause[0].trim();
        clause[1] = clause[1].trim();
        clause[2] = clause[2].trim();
        return clause;
    }

}
